package com.atguigu.gmall.common.service;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.entity.GmallCorrelationData;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.UUID;

/**
 * @author: 李旭
 * @create: 2021-09-11 16:07
 *    RabbitMQ 发消息  封装实现类
 *
 **/
@SuppressWarnings("all")
@Component//实例化
public class RabbitService {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private RedisTemplate redisTemplate;
    //发消息
    public void sendMessage(String exchange,String routingKey,Object msg){
        GmallCorrelationData gmallCorrelationData = new GmallCorrelationData();
        //
        String uuid = UUID.randomUUID().toString();
        gmallCorrelationData.setId(uuid);
        System.out.println(uuid);

        //交换机
        gmallCorrelationData.setExchange(exchange);
        //routingKey
        gmallCorrelationData.setRoutingKey(routingKey);
        //消息
        gmallCorrelationData.setMessage(msg);

        //保存GmallCorrelationData到Redis缓存中 如果队列失败 在失败应答方法中 获取Redis缓存中的
        // Jackson  @RequestBody  SpringMVC  转JSON需要对象实现序列化接口
        // fastjson JSONObject.toJSONString :JSON转换的时候不需要序列化接口  JSON转换性能最好的框架

        //GmallCorrelationData
        redisTemplate.opsForValue().set(uuid, JSONObject.toJSONString(gmallCorrelationData));
        //发消息
        rabbitTemplate.convertAndSend(exchange,routingKey,msg,gmallCorrelationData);
    }
    //发延迟消息 基于死信  注意消息不丢失问题
    public void sendDeadLetterMessage(String exchange,String routingKey,Object msg,int delayTime){
        GmallCorrelationData gmallCorrelationData = new GmallCorrelationData();
        //
        String uuid = UUID.randomUUID().toString();
        gmallCorrelationData.setId(uuid);
        System.out.println(uuid);

        //交换机
        gmallCorrelationData.setExchange(exchange);
        //routingKey
        gmallCorrelationData.setRoutingKey(routingKey);
        //消息
        gmallCorrelationData.setMessage(msg);

        //是延迟消息
        gmallCorrelationData.setDeadLetterDelay(true);
        //延迟时间
        gmallCorrelationData.setDelayTime(delayTime);
        //保存GmallCorrelationData到Redis缓存中 如果队列失败 在失败应答方法中 获取Redis缓存中的
        // Jackson  @RequestBody  SpringMVC  转JSON需要对象实现序列化接口
        // fastjson JSONObject.toJSONString :JSON转换的时候不需要序列化接口  JSON转换性能最好的框架
        //GmallCorrelationData
        redisTemplate.opsForValue().set(uuid, JSONObject.toJSONString(gmallCorrelationData));
        //发延迟消息
        rabbitTemplate.convertAndSend(exchange,routingKey,msg,(m) -> {
            //延迟消息的 过期时间  ttl   毫秒
            m.getMessageProperties().setExpiration(String.valueOf(1000*delayTime));
            System.out.println("发消息的时间：" + new Date());
            return m;
        } ,gmallCorrelationData);
    }
    //发送延迟消息 基于插件
    public void sendDelayedMessage(String exchange,String routingKey,Object msg,int delayTime){
        GmallCorrelationData gmallCorrelationData = new GmallCorrelationData();
        //
        String uuid = UUID.randomUUID().toString();
        gmallCorrelationData.setId(uuid);
        System.out.println(uuid);

        //交换机
        gmallCorrelationData.setExchange(exchange);
        //routingKey
        gmallCorrelationData.setRoutingKey(routingKey);
        //消息
        gmallCorrelationData.setMessage(msg);

        //是延迟消息
        gmallCorrelationData.setDelayedDelay(true);
        //延迟时间
        gmallCorrelationData.setDelayTime(delayTime);
        //保存GmallCorrelationData到Redis缓存中 如果队列失败 在失败应答方法中 获取Redis缓存中的
        // Jackson  @RequestBody  SpringMVC  转JSON需要对象实现序列化接口
        // fastjson JSONObject.toJSONString :JSON转换的时候不需要序列化接口  JSON转换性能最好的框架
        //GmallCorrelationData
        redisTemplate.opsForValue().set(uuid, JSONObject.toJSONString(gmallCorrelationData));
        //发延迟消息
        rabbitTemplate.convertAndSend(exchange,routingKey,msg,(m) -> {
            //延迟消息的  延迟时间   毫秒
            m.getMessageProperties().setDelay(delayTime*1000);
            System.out.println("发消息的时间：" + new Date());
            return m;
        } ,gmallCorrelationData);
    }

}
